new Vue({
    el: '#app',
    data() {
        return {
            //修改大模型悬浮框是否可以点击
            changeMultiBtn: true,
            showPopover: true,
            //流式控制器
            abortCtrl: null,
            streaming: false,
            isflageIOX: true,

            //i国网录音相关
            voicelist: [],
            timetimer1:null,
            isFlagStartTrue: false,

            clipboard: {
                content: "",
            },
            writingType: 3,
            //接口调用sessionId
            infSessionId: '',
            //当前步骤:1-生成大纲页面2-大纲编辑页面3-生成内容页面4-文档校核页面5-生成方案页面
            currentStep: 1,
            showVoiceDialog: false,
            //是否正在录音
            voicing:false,
            //语音内容
            voiceContent:'',
            form: {
                topic: '',
                date: '',
                location: '',
                participant: '',
                agenda: '',
                demand: ''
            },
            //模板列表
            modelList: [
                { id: '-1', modelName: '', img: '../../../image/loading2.gif' },
            ],
            //当前选中模板
            curModelId: '',
            //图片预览
            modelImageShow: false,
            modelImages: [],
            modelImageIndex: 0,

            curPId: '',
            //word格式方案
            wordResult: {
                // id: "a"
            },
            //word结果显示
            wordLoading: false,
            //ppt格式方案
            pptResult: {
                // id: "b"
            },
            //ppt结果显示
            pptLoading: false,
            focus: false,
            requireText: '',
            chatting: false,
            //内容是否可编辑标志
            contentEditFlag:false,
            //会议通知内容
            noticeMdContent: '',
// `# 交通违法工作方案

// ## 一、工作目标

// 为有效应对当前交通违法行为的严峻形势，提升道路交通安全水平，特制定本工作方案。本方案旨在明确交通违法治理的总体目标和阶段性任务，通过一系列措施显著降低交通违法行为发生率，同时增强公众交通安全意识，形成遵章守法、文明出行的良好社会风尚。

// ## 二、工作任务

// ### (一)违法行为排查与监测

// #### 任务一:建立违法行为监测系统

// - **实施策略**：充分利用现代科技手段，如智能交通监控系统、大数据分析平台等，构建覆盖全城的交通违法行为监测系统。该系统将实现对重点路段、时段及常见违法行为的实时监控与预警，为精准打击交通违法提供有力支持。
// - **预期成果**：形成高效、精准的交通违法监测网络，提高违法行为的发现率和查处率。

// #### 任务二:定期违法数据统计分析

// - **实施步骤**：建立定期的数据统计分析机制，对监测到的交通违法数据进行深入分析，识别违法高发区域、时段及类型。同时，将分析结果以报告形式呈现，为决策部门提供科学依据。
// - **预期成果**：形成科学的交通违法数据分析报告，为制定和调整治理措施提供有力支撑。

// ### (二)执法力度强化

// #### 任务一:加大现场执法力度

// - **具体措施**：增加路面执法警力，特别是在违法高发时段和路段加强巡逻管控。对发现的交通违法行为进行严厉查处，形成强大的震慑力。
// - **预期效果**：通过加大现场执法力度，有效遏制交通违法行为的蔓延势头。

// #### 任务二:完善非现场执法机制

// - **实施路径**：推广电子警察、移动执法车等非现场执法手段，扩大执法覆盖面。建立健全违法信息录入、审核、告知及处罚流程，确保执法公正、透明。
// - **预期成果**：实现交通违法行为的全方位、全天候监控和查处，提高执法效率和公正性。

// ### (三)宣传教育引导

// #### 任务一:开展交通安全宣传活动

// - **活动形式**：组织开展形式多样的交通安全宣传活动，如主题讲座、展览、媒体宣传等。通过生动形象的案例和深入浅出的讲解，提高公众对交通违法危害性的认识。
// - **预期效果**：增强公众的交通安全意识，形成全社会共同关注交通安全的良好氛围。

// #### 任务二:强化驾驶员教育培训

// - **培训内容**：加强对驾驶员的交通安全教育培训，特别是针对新驾驶员和违法记录较多的驾驶员进行重点教育。培训内容应涵盖交通法规、安全驾驶技巧等方面。
// - **实施方式**：推广交通安全知识在线学习平台，方便驾驶员随时随地进行学习。同时，定期组织线下培训活动，加强实践操作和互动交流。
// - **预期成果**：提高驾驶员的交通安全意识和驾驶技能水平，减少因人为因素导致的交通事故。

// ### (四)社会共治机制建设

// #### 任务一:建立跨部门协作机制

// - **协作内容**：加强与公安、交通、城管等相关部门的沟通协调，形成治理交通违法的合力。通过信息共享、联合执法等方式提高治理效率。
// - **实施方式**：定期召开联席会议，研究解决治理过程中遇到的问题和困难。同时建立快速响应机制，对突发情况进行及时处置。
// - **预期效果**：形成多部门协同作战的良好局面，提高交通违法治理的整体效能。

// #### 任务二:鼓励公众参与监督

// - **监督方式**：建立交通违法举报奖励制度，鼓励公众通过热线电话、网络平台等方式举报交通违法行为。同时加强对举报信息的核实和处理工作确保举报渠道的畅通和有效。
// - **激励机制**：对举报属实的给予适当奖励以激发公众参与监督的积极性。同时加强对举报人的保护工作确保其人身安全不受侵害。
// - **预期效果**：形成全社会共同参与交通违法监督的良好氛围有效遏制交通违法行为的发生。

// ## 三、保障措施

// ### (一)政策支持与资金投入

// - **政策支持**：积极争取政府政策支持将交通违法治理纳入城市发展规划和财政预算确保治理工作的顺利开展。
// - **资金投入**：加大资金投入力度保障监测设备、执法装备及宣传教育活动等所需经费的充足供应。同时加强对资金使用情况的监管确保资金使用的合理性和有效性。

// ### (二)法律法规完善

// - **修订完善**：推动相关法律法规的修订完善为交通违法治理提供更加坚实的法律保障。特别是要加强对新型交通违法行为的法律规制确保治理工作的有法可依、有章可循。
// - **法律培训**：加强对执法人员的法律培训提高其依法行政水平和法律素养。确保在执法过程中能够准确适用法律法规维护社会公平正义。

// ### (三)监督评估与持续改进

// - **监督评估**：建立交通违法治理工作监督评估机制定期对治理效果进行评估。通过评估结果了解治理工作的进展情况和存在的问题为制定和调整治理措施提供依据。
// - **持续改进**：根据评估结果及时调整工作策略持续改进治理措施。确保治理工作能够不断适应新形势、新任务的要求取得更加显著的成效。`,
            noticeHtmlContent: '',
// `<h1>交通违法工作方案</h1>
// <h2>一、工作目标</h2>
// <p>为有效应对当前交通违法行为的严峻形势，提升道路交通安全水平，特制定本工作方案。本方案旨在明确交通违法治理的总体目标和阶段性任务，通过一系列措施显著降低交通违法行为发生率，同时增强公众交通安全意识，形成遵章守法、文明出行的良好社会风尚。</p>
// <h2>二、工作任务</h2>
// <h3>(一)违法行为排查与监测</h3>
// <h4>任务一:建立违法行为监测系统</h4>
// <ul>
// <li><strong>实施策略</strong>：充分利用现代科技手段，如智能交通监控系统、大数据分析平台等，构建覆盖全城的交通违法行为监测系统。该系统将实现对重点路段、时段及常见违法行为的实时监控与预警，为精准打击交通违法提供有力支持。</li>
// <li><strong>预期成果</strong>：形成高效、精准的交通违法监测网络，提高违法行为的发现率和查处率。</li>
// </ul>
// <h4>任务二:定期违法数据统计分析</h4>
// <ul>
// <li><strong>实施步骤</strong>：建立定期的数据统计分析机制，对监测到的交通违法数据进行深入分析，识别违法高发区域、时段及类型。同时，将分析结果以报告形式呈现，为决策部门提供科学依据。</li>
// <li><strong>预期成果</strong>：形成科学的交通违法数据分析报告，为制定和调整治理措施提供有力支撑。</li>
// </ul>
// <h3>(二)执法力度强化</h3>
// <h4>任务一:加大现场执法力度</h4>
// <ul>
// <li><strong>具体措施</strong>：增加路面执法警力，特别是在违法高发时段和路段加强巡逻管控。对发现的交通违法行为进行严厉查处，形成强大的震慑力。</li>
// <li><strong>预期效果</strong>：通过加大现场执法力度，有效遏制交通违法行为的蔓延势头。</li>
// </ul>
// <h4>任务二:完善非现场执法机制</h4>
// <ul>
// <li><strong>实施路径</strong>：推广电子警察、移动执法车等非现场执法手段，扩大执法覆盖面。建立健全违法信息录入、审核、告知及处罚流程，确保执法公正、透明。</li>
// <li><strong>预期成果</strong>：实现交通违法行为的全方位、全天候监控和查处，提高执法效率和公正性。</li>
// </ul>
// <h3>(三)宣传教育引导</h3>
// <h4>任务一:开展交通安全宣传活动</h4>
// <ul>
// <li><strong>活动形式</strong>：组织开展形式多样的交通安全宣传活动，如主题讲座、展览、媒体宣传等。通过生动形象的案例和深入浅出的讲解，提高公众对交通违法危害性的认识。</li>
// <li><strong>预期效果</strong>：增强公众的交通安全意识，形成全社会共同关注交通安全的良好氛围。</li>
// </ul>
// <h4>任务二:强化驾驶员教育培训</h4>
// <ul>
// <li><strong>培训内容</strong>：加强对驾驶员的交通安全教育培训，特别是针对新驾驶员和违法记录较多的驾驶员进行重点教育。培训内容应涵盖交通法规、安全驾驶技巧等方面。</li>
// <li><strong>实施方式</strong>：推广交通安全知识在线学习平台，方便驾驶员随时随地进行学习。同时，定期组织线下培训活动，加强实践操作和互动交流。</li>
// <li><strong>预期成果</strong>：提高驾驶员的交通安全意识和驾驶技能水平，减少因人为因素导致的交通事故。</li>
// </ul>
// <h3>(四)社会共治机制建设</h3>
// <h4>任务一:建立跨部门协作机制</h4>
// <ul>
// <li><strong>协作内容</strong>：加强与公安、交通、城管等相关部门的沟通协调，形成治理交通违法的合力。通过信息共享、联合执法等方式提高治理效率。</li>
// <li><strong>实施方式</strong>：定期召开联席会议，研究解决治理过程中遇到的问题和困难。同时建立快速响应机制，对突发情况进行及时处置。</li>
// <li><strong>预期效果</strong>：形成多部门协同作战的良好局面，提高交通违法治理的整体效能。</li>
// </ul>
// <h4>任务二:鼓励公众参与监督</h4>
// <ul>
// <li><strong>监督方式</strong>：建立交通违法举报奖励制度，鼓励公众通过热线电话、网络平台等方式举报交通违法行为。同时加强对举报信息的核实和处理工作确保举报渠道的畅通和有效。</li>
// <li><strong>激励机制</strong>：对举报属实的给予适当奖励以激发公众参与监督的积极性。同时加强对举报人的保护工作确保其人身安全不受侵害。</li>
// <li><strong>预期效果</strong>：形成全社会共同参与交通违法监督的良好氛围有效遏制交通违法行为的发生。</li>
// </ul>
// <h2>三、保障措施</h2>
// <h3>(一)政策支持与资金投入</h3>
// <ul>
// <li><strong>政策支持</strong>：积极争取政府政策支持将交通违法治理纳入城市发展规划和财政预算确保治理工作的顺利开展。</li>
// <li><strong>资金投入</strong>：加大资金投入力度保障监测设备、执法装备及宣传教育活动等所需经费的充足供应。同时加强对资金使用情况的监管确保资金使用的合理性和有效性。</li>
// </ul>
// <h3>(二)法律法规完善</h3>
// <ul>
// <li><strong>修订完善</strong>：推动相关法律法规的修订完善为交通违法治理提供更加坚实的法律保障。特别是要加强对新型交通违法行为的法律规制确保治理工作的有法可依、有章可循。</li>
// <li><strong>法律培训</strong>：加强对执法人员的法律培训提高其依法行政水平和法律素养。确保在执法过程中能够准确适用法律法规维护社会公平正义。</li>
// </ul>
// <h3>(三)监督评估与持续改进</h3>
// <ul>
// <li><strong>监督评估</strong>：建立交通违法治理工作监督评估机制定期对治理效果进行评估。通过评估结果了解治理工作的进展情况和存在的问题为制定和调整治理措施提供依据。</li>
// <li><strong>持续改进</strong>：根据评估结果及时调整工作策略持续改进治理措施。确保治理工作能够不断适应新形势、新任务的要求取得更加显著的成效。</li>
// </ul>
// `,
            //语音
            voiceType: 0, //0:没有录音,1:正在录音
            subjectTalking: false,
            MODEL_CODE: '1888', 
            CAPACITY_CODE: '010115',
            LANG: 'zh',
            WS_URL: '',
            checkSwitch: false,
            VoiceItemID: generateUUID(),
            timer: null,
            count: 0,
            checkClick: 1,
            bufferData: [],
            voiceTxt:{
                ind: '',
                old: ''
            },
            myWebsocket: null,

            //ppt模板弹窗
            showPptDialog: false,
            //ppt生成对象
            pptForm: {
                //标题
                title: '',
                //模板id
                modelId: '',
            },
            //通用模板
            pptComModelList:[
                // {id:'1',logo:'../images/ppt/ppt-common1.png'},
                // {id:'2',logo:'../images/ppt/ppt-common2.png'},
                // {id:'3',logo:'../images/ppt/ppt-common1.png'},
                // {id:'4',logo:'../images/ppt/ppt-common1.png'}
            ],
                
            //专用模板
            pptDedModelList:[
                // {id:'5',logo:'../images/ppt/ppt-common1.png'},
                // {id:'6',logo:'../images/ppt/ppt-common2.png'},
            ],

            //流式输出显示控制
            chatTimer: null,
            chatBuffer: [],
            chatEnd: true,
            showTimeFlag: false,
            selDate: new Date(),
            minDate: null,
            maxDate: null,
            showTimeFlag2: false,
            selDate2: new Date(),

            //底部生成大纲按钮是否显示
            bottomShow: true,
        }
    },
    watch: {
        showVoiceDialog: {
            handler(value) {
                if(!value) {
                    this.voiceContent = ''
                    this.stopTalk()
                }
            }
        },
        voiceType: {
            handler(value) {
                if(0 == value) {
                    this.stopTalk()
                }
            }
        },
        streaming: {
            handler(newValue, oldValue) {
                this.changeMultiBtn = !newValue
            },
            immediate: true
        },
    },
    created() {
        const _this = this
        //初始化会议时间
        // this.form.date = this.formatTime(new Date())
        let jsApiList = []
        $.getScript("../../../js/jweixin-sgccigw-1.0.0.js" /*"js/jweixin-1.0.0.js"*/, function () {
            'use strict';
            wx.ready(function () {
                wx.onHistoryBack(() => {
                    _this.home()
                    return false
                })
            });
            jsApiList = [
                'startRecord',
                'stopRecord',
                'onVoiceRecordEnd',
                'translateVoice',                
                'previewFile',
                'startRecordVoiceBuffer',
                'ext_AudioRecorder_Start',
                'ext_AudioRecorder_Stop',
                'onRecordBufferReceived',
                'multiWindows_subscribe',
                'stopRecord',
                'onHistoryBack',
            ];
            wx.config({
                beta: true, // 调用wx.invoke形式的接口值时，该值必须为true。
                debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
                appId: corpid,
                timestamp: '1626832073',
                nonceStr: nonceStr,
                signature: signature,
                jsApiList: jsApiList
            });
        });
    },
    mounted() {
        this.compatibleInput()
        this.getTemplateList()
        this.addListener()
        window.addEventListener('resize', this.handleResize())
        window.addEventListener('contextmenu', (e) => e.preventDefault());
        // this.currentStep = 2
        // this.wordLoading = true
        // this.wordResult = {
        //     "id": "aa"
        // }
        // this.pptLoading = true
        // this.pptResult = {
        //     "id": "aa"
        // }
    },
    methods: {
        handleResize(){
            this.$nextTick(()=>{
                var originalHeight=document.documentElement.clientHeight ||document.body.clientHeight;
                window.onresize = () => {
                    var resizeHeight=document.documentElement.clientHeight || document.body.clientHeight;
                    if(resizeHeight<originalHeight){
                        this.bottomShow = false
                    } else {
                        this.bottomShow = true
                    }
                }
            })
        },
        handleInputFocus() {
            if(!this.voiceType) {
                this.bottomShow = false
            }
        },
        handleInputBlur() {
            this.bottomShow = true
        },
        timerFormatter(type, val) {
            if (type === 'year') {
              return val + '年';
            }
            if (type === 'month') {
              return val + '月';
            }
            if (type === 'day') {
              return val + '日';
            }
            if (type === 'hour') {
                return val + '时';
            }
            if (type === 'minute') {
                return val + '分';
            }
            return val;
          },
        showTimePicker(){
            this.minDate = new Date()
            let now = new Date()
            now.setFullYear(now.getFullYear() + 2)
            this.maxDate = now; 
            this.showTimeFlag = true;
            this.selDate = new Date()
        },
        confirmDate(value){
            this.showTimeFlag = false
            if(this.selDate){
                this.form.date = this.formatTime(this.selDate)
            }
        },
        cancelDate(){
            this.showTimeFlag = false
            this.selDate = null;
        },
        showTimePicker2(){
            this.minDate = new Date()
            let now = new Date()
            now.setFullYear(now.getFullYear() + 2)
            this.maxDate = now; 
            this.showTimeFlag2 = true;
            this.selDate2 = new Date()
        },
        confirmDate2(value){
            this.showTimeFlag2 = false
            if(this.selDate2){
                this.form.endDate = this.formatTime(this.selDate2)
            }
        },
        cancelDate2(){
            this.showTimeFlag2 = false
            this.selDate2 = null;
        },
        formatTime(date) {
            // let d = date.toLocaleDateString()
            // let hour = date.getHours()
            // let minutes = date.getMinutes().toString().padStart(2, '0')
            // return d + ' ' + hour + ':' + minutes;
            return dateFormat('yyyy年MM月dd日 hh:mm', date)
        },
        addListener(){
            document.addEventListener('click', (event) => {
                let el = document.getElementById('noticeContentDiv')
                if(!this.contentEditFlag || el == undefined){
                    return;
                }
                if (!el.contains(event.target)) {
                    this.contentEditFlag = false;
                    el.style.border = 'none'
                    el.style.padding = '0px'
                    el.style.borderRadius = '0px'
                    el.style.backgroundColor = '#F6F7F9'
                } 
            });
        },
        markdown2Html(tmd) {
            let md = tmd.replace(/\`\`\`markdown/g, '').replace(/\`\`\`/g, '').replace(/\n/g, "  \n\n")
            
            try{
                md = decodeURIComponent(md)
            }catch (error) {
                md = md
            }
            return marked.parse(md)
        },
        //选择模板
        selModel(item) {
            if(this.curModelId == item.id) {
                //当前已选中
                this.modelImages = [item.img]
                this.modelImageShow = true
            }else {
                this.curModelId = item.id;
            }
        },
        handleTouchStart(event, item) {
            this.touchTimer = setTimeout(() => {
                this.modelImageShow = true
            }, 500);
        },
        handleTouchEnd(event, item) {
            this.touchTimer = clearTimeout(this.touchTimer)
            console.log("长按结束")
        },
        onImageChange(index) {
            this.modelImageIndex = index
        },
        //下一步
        nextStep() {
            // if(this.abortCtrl) {
            //     this.stopGen()
            // }
            if(this.streaming) {
                mui.toast('生成中不能跳转', {
                    duration: 1000,
                    type: 'div'
                })
                return
            }
            if(1 == this.currentStep) {
                this.noticeMdContent = ''
                // 将Markdown转换为HTML
                this.noticeHtmlContent = ''
                this.stopTalk()
                //生成内容
                this.genContent()
            }
        },
        validForm() {
            if(!this.form.topic) {
                mui.toast("请填写主题", { duration: "long", type: "div" });
                return false
            }
            if(!this.form.date) {
                mui.toast("请填写时间", { duration: "long", type: "div" });
                return false
            }
            if(!this.form.location) {
                mui.toast("请填写地点", { duration: "long", type: "div" });
                return false
            }
            if(!this.form.participant) {
                mui.toast("请填写参会人员", { duration: "long", type: "div" });
                return false
            }
            if(!this.form.agenda) {
                mui.toast("请填写会议议程", { duration: "long", type: "div" });
                return false
            }
            if(this.curModelId != 6) {
                //非第一个模板
                if(!this.form.endDate) {
                    mui.toast("请填写结束时间", { duration: "long", type: "div" });
                    return false
                }
                if(this.parseChineseDateTime(this.form.date)-this.parseChineseDateTime(this.form.endDate) >= 0) {
                    mui.toast("结束时间须大于时间", { duration: "long", type: "div" });
                    return false
                }
            }
            // if(!this.form.demand) {
            //     mui.toast("请填写会议要求", { duration: "long", type: "div" });
            //     return false
            // }
            return true
        },
        //生成会议通知
        genContent() {
            if(!this.validForm()) {
                return
            }
            $(".curtain").css("display", "block");
            //TODO 生成内容后台请求
            const userId = sessionStorage.getItem("userId");
            let param = {
                "userId": userId,
                "subjectTitle": this.form.topic,
                "curModelId": this.curModelId,
                "type": this.writingType, //会议通知
                "modelType": getLargeModelType(),
                "place": this.form.location,
                "text": JSON.stringify(this.form),
                "timestamp": new Date().getTime() + "",
            };
            $(".curtain").css("display", "block");
            this.currentStep = this.currentStep + 1
            this.abortCtrl = streamChat(localUrlLink + iscp_port + "/tjAiAssistant/writing/genContent", param,
                (res) => {
                    //成功回调
                    // console.log(res)
                    this.streaming = true
                    $(".curtain").css("display", "none");
                    if(200 == res.code) {
                        let result = res.resultValue

                        // this.chatBuffer.push(result.content)

                        this.noticeMdContent += result.content
                        // 将Markdown转换为HTML
                        this.noticeHtmlContent = this.markdown2Html(this.noticeMdContent)
                        // this.addClickEvent()
                        this.handleScrollBottom('contentRef')
                    }else {
                        //请求异常
                        // this.chatEnd = true
                        this.streaming = false
                        mui.toast("会议通知生成异常", { duration: "long", type: "div" });
                    }
                }, (err) => {
                    //失败回调
                    // this.chatEnd = true
                    this.streaming = false
                    $(".curtain").css("display", "none");
                    mui.toast("会议通知生成异常", { duration: "long", type: "div" });
                }, res => {
                    // this.chatEnd = true
                    if(this.streaming) {
                        mui.toast("会议通知生成完成", { duration: "long", type: "div" });
                    }
                    this.streaming = false
                    $(".curtain").css("display", "none");
                });
        },
        //生成WORD
        createDoc() {
            // $(".curtain").css("display", "block");
            this.wordLoading = true
            this.pptLoading = false
            this.pptResult = {}
            this.wordResult = {
                "writingId": this.wordResult.writingId ? this.wordResult.writingId : '' 
            }
            this.handleScrollBottom('programMainRef')
            setTimeout(() => {
                const userId = sessionStorage.getItem("userId");
                this.noticeHtmlContent = document.getElementById('noticeContentDiv').innerHTML
                let param = {
                    "id": this.wordResult.writingId,
                    "userId": userId,
                    "subjectTitle": this.form.topic,
                    "content": html2Md(this.noticeHtmlContent),
                    "requirement": JSON.stringify(this.form),
                    "type": this.writingType, //会议通知
                    "modelType": getLargeModelType(),
                    "timestamp": new Date().getTime() + "",
                };
                let AuthenticationSession = sessionStorage.getItem("Authentication");
                data = JSON.stringify(param)
                let sign = sm3(data);
                $.ajax({
                    url: localUrlLink + iscp_port + "/tjAiAssistant/writing/createDoc",
                    type: "post",
                    async: false, //是否同步，false表示同步请求
                    dataType: "json",
                    data: data,
                    headers: {
                        "Content-Type": "application/json;charset=UTF-8",
                        Authentication: AuthenticationSession,
                        sign: sign
                    },
                    success: (res, txt, xhr) => {
                        $(".curtain").css("display", "none");
                        // { id: '1', fileName: '人工智能：塑造未来的技术力量.docx', type: 'word', fileSize: '126.35KB' },
                        if (res.code == 200) {
                            this.wordResult = {
                                "id": res.resultValue.id,
                                "writingId": res.resultValue.writingId,
                                "fileName": res.resultValue.name,
                                "type": 'word',
                                "size": res.resultValue.size,
                                "fileSize": calcFileSize(res.resultValue.size),
                            }
                        } else {
                            mui.toast('请稍后再试', {
                                duration: 1000,
                                type: 'div'
                            })
                        }
                    },
                    error: (e) => {
                        $(".curtain").css("display", "none");
                        mui.toast('请稍后再试', {
                            duration: 1000,
                            type: 'div'
                        })
                    },
                });
            }, 1000);
        },
        //显示语音弹窗
        showVoice(){
            this.showVoiceDialog = true;
        },
        closeVoiceDialog(){
            this.showVoiceDialog = false;
        },
        //自动填充
        autoFillForm(){
            console.log(this.voiceContent)

            $(".curtain").css("display", "block");
            const userId = sessionStorage.getItem("userId");
            let param = {
                "userId": userId,
                "content": this.voiceContent,
                "type": this.writingType,
                "modelType": getLargeModelType(),
                "timestamp": new Date().getTime() + "",
            };
            let AuthenticationSession = sessionStorage.getItem("Authentication");
            // data = JSON.stringify(param)
            // let sign = sm3(data);


            this.abortCtrl = streamChat(localUrlLink + iscp_port + "/tjAiAssistant/writing/meetingNotifyExtract", param,
                (res) => {
                    $(".curtain").css("display", "none");
                    //成功回调
                    console.log(res)
                    if(200 == res.code) {
                        this.form = res.resultValue
                        this.closeVoiceDialog()
                    }else {
                        //请求异常
                        mui.toast("会议通知信息提取异常", { duration: "long", type: "div" });
                    }
                }, (err) => {
                    //失败回调
                    $(".curtain").css("display", "none");
                    mui.toast("会议通知信息提取异常", { duration: "long", type: "div" });
                }, e => {
                    //请求完成
                    $(".curtain").css("display", "none");
                });

        },
        //编辑内容
        editNoticeContent(event){
            event.stopPropagation()
            let el = document.getElementById('noticeContentDiv')
            this.contentEditFlag = true;
            el.style.border = '1px solid #6090BE'
            el.style.padding = '15px'
            el.style.borderRadius = '15px'
            el.style.backgroundColor = '#FFF'
            this.handleScrollBottom('contentRef')
            mui.toast("点击内容进行修改", { duration: "long", type: "div" });
        },
        stopPop(event){
            event.stopPropagation()
            return ;
        },
        /**
         * 获取ppt模板
         */
        getPptModelList() {
            const userId = sessionStorage.getItem("userId");
            let param = {
                "userId": userId,
                "modelType": getLargeModelType(),
                "timestamp": new Date().getTime() + "",
            };
            let AuthenticationSession = sessionStorage.getItem("Authentication");
            data = JSON.stringify(param)
            let sign = sm3(data);
            $.ajax({
                url: localUrlLink + iscp_port + "/tjAiAssistant/ppt/getTemplatesList",
                type: "post",
                async: false, //是否同步，false表示同步请求
                dataType: "json",
                data: data,
                headers: {
                    "Content-Type": "application/json;charset=UTF-8",
                    Authentication: AuthenticationSession,
                    sign: sign
                },
                success: (res, txt, xhr) => {
                    if (res.code == 200) {
                        this.pptComModelList = res.resultValue.general;
                        this.pptDedModelList = res.resultValue.special;
                        this.showPptDialog = true
                        //TODO 加载专有模板与通用模板
                        this.pptForm.title = this.form.topic
                    } else {
                        mui.toast('请稍后再试', {
                            duration: 1000,
                            type: 'div'
                        })
                    }
                },
                error: (e) => {
                    $(".curtain").css("display", "none");
                    mui.toast('请稍后再试', {
                        duration: 1000,
                        type: 'div'
                    })
                },
            });
        },
        //打开ppt模板
        showPptSheet(wordResult) {
            this.getPptModelList()
            this.showPptDialog = true
            //TODO 加载专有模板与通用模板
            this.pptForm.title = this.form.topic
        },
        //选择ppt模板
        selPptModel(item){
            this.pptForm.modelId = item.id;
        },
        //生成ppt
        createPpt(){
            if(!this.pptForm.modelId) {
                mui.toast('请选择PPT模板', {
                    duration: 1000,
                    type: 'div'
                })
                return
            }
            if(!this.pptForm.title) {
                mui.toast('请填写文件标题', {
                    duration: 1000,
                    type: 'div'
                })
                return
            }
            $(".curtain").css("display", "block");
            const userId = sessionStorage.getItem("userId");
            let param = {
                "id": this.wordResult.writingId,
                "wordId": this.wordResult.id ? this.wordResult.id : "",
                "userId": userId,
                "modelId": this.pptForm.modelId,
                "type": this.writingType, //会议通知
                "modelType": getLargeModelType(),
                "subject": this.pptForm.title,
                "timestamp": new Date().getTime() + "",
            };
            let AuthenticationSession = sessionStorage.getItem("Authentication");
            data = JSON.stringify(param)
            let sign = sm3(data);

            this.abortCtrl = streamChat(localUrlLink + iscp_port + "/tjAiAssistant/writing/createPpt", param,
                (res) => {
                    //成功回调
                    // console.log(res)
                    $(".curtain").css("display", "none");
                    if (res.code == 200) {
                        this.pptResult = {
                            "id": res.resultValue.id,
                            "fileName": res.resultValue.name,
                            "type": 'ppt',
                            "size": res.resultValue.size,
                            "fileSize": calcFileSize(res.resultValue.size),
                        }
                        this.showPptDialog = false
                        this.handleScrollBottom('programMainRef')
                    } else {
                        mui.toast('请稍后再试', {
                            duration: 1000,
                            type: 'div'
                        })
                    }
                }, (err) => {
                    $(".curtain").css("display", "none");
                    mui.toast('请稍后再试', {
                        duration: 1000,
                        type: 'div'
                    })
                }, res => {
                    $(".curtain").css("display", "none");
                    mui.toast("PPT生成完成", { duration: "long", type: "div" });
                });
        },
        //创建pdf
        createPdf(item) {
            if(!item.id) {
                return
            }
            if(this.pptResult.id) {
                return
            }
            // $(".curtain").css("display", "block");
            this.pptLoading = true
            this.handleScrollBottom('programMainRef')
            const userId = sessionStorage.getItem("userId");
            let param = {
                "id": this.wordResult.writingId,
                "wordId": this.wordResult.id ? this.wordResult.id : "",
                "userId": userId,
                "type": this.writingType, //会议通知
                "modelType": 'BAIDU', //getLargeModelType(),
                "timestamp": new Date().getTime() + "",
            };
            let AuthenticationSession = sessionStorage.getItem("Authentication");
            data = JSON.stringify(param)
            let sign = sm3(data);

            this.abortCtrl = streamChat(localUrlLink + iscp_port + "/tjAiAssistant/writing/createPdf", param,
                (res) => {
                    //成功回调
                    // console.log(res)
                    $(".curtain").css("display", "none");
                    if (res.code == 200) {
                        this.pptResult = {
                            "id": res.resultValue.id,
                            "fileName": res.resultValue.name,
                            "type": 'pdf',
                            "size": res.resultValue.size,
                            "fileSize": calcFileSize(res.resultValue.size),
                        }
                        mui.toast("PDF生成完成", { duration: "long", type: "div" });
                    } else {
                        mui.toast('请稍后再试', {
                            duration: 1000,
                            type: 'div'
                        })
                    }
                }, (err) => {
                    $(".curtain").css("display", "none");
                    mui.toast('请稍后再试', {
                        duration: 1000,
                        type: 'div'
                    })
                }, res => {
                    $(".curtain").css("display", "none");
                });
        },
        //关闭编辑
        closePopOver(){
            if(!this.quickSel) {
                //移除所有的edit样式
                let pEle = document.getElementById(this.curPId)
                document.getElementById('edit-popover').style.display = 'none'
                pEle.classList.remove('p-edit')
                return false;
            }
        },
        //添加点击事件
        addClickEvent(){
            setTimeout(()=>{
                this.$nextTick(() => {
                    // 获取div元素
                    var div = document.getElementById('step3-mdBody');
                    
                    this.addElementList.forEach((em) => {
                        // 获取div内的所有元素
                        var pItems = div.querySelectorAll(em);

                        // 添加事件监听器
                        pItems.forEach((pElement) => {
                            pElement.addEventListener('click', (event) => {
                                var clsItems = document.querySelectorAll(".p-edit");
                                if(clsItems){
                                    clsItems.forEach((cItem) => {
                                        cItem.classList.remove('p-edit')
                                    })
                                }
                                
                                pElement.classList.add("p-edit"); // 增加class
                                if(!pElement.id) {
                                    pElement.id = 'md-'+em+'-' + new Date().getTime();
                                }

                                this.curPId = pElement.id
                                this.showPopover = true
                                document.getElementById('edit-popover').style.display = 'block'
                                document.getElementById('edit-popover').style.top = 'calc('+pElement.offsetTop+'px - 3rem)'
                                document.getElementById('edit-popover').style.left = '-30px'
                            });
                        });
                    })
                });
            },500)
            
        },
        handleEditPContent(){
            let pEle = document.getElementById(this.curPId)
            phtml = pEle.innerHTML
            document.getElementById('edit-popover').style.display = 'none'
            pEle.classList.remove('p-edit')
            this.showEditDialog = true
            this.editGenCont = phtml
        },
        //编辑取消
        editCancle(){
            this.curPId = ''
            this.showEditDialog = false
        },
        chooseUpload(type) {
            if(1 == type && !this.curPId) {
                mui.toast("请选择修改内容", { duration: "long", type: "div" });
                return
            }
            this.fileType = type

            let filePathList = this.$refs.chooseDirRef.filePathList
            if(localStorage.getItem("showBtn") == 'true' && filePathList.length >= 2 && !this.isflageIOX ){
                this.$refs.chooseDirRef.showFilepath = true
            }else {
                this.uploadFunc()
            }
        },
        chooseDirUpload(item) {
            if(item&&(item.id != 0)) {
                let _that = this
                wx.invoke("ext_FileBrowser_AppointDirChooseFile", 
                    {data : {"appointDirPath": item.pathName}}, 
                    (res) => {
                        _that.channelId = "writing_upload_" + createNonceStr(8) + new Date().getTime() + "";
                        console.log('res', res)
                        let recordArr = [{
                            name: res.name,
                            path: res.filePath,
                            fileSize: res.size
                        }]
                        const suffix = recordArr[0].name.split('.').reverse()[0]
                        if(0 == Number(recordArr[0].fileSize)) {
                            mui.toast('文件不能为空', {
                                duration: 'long',
                                type: 'div'
                            })
                            return
                        }
                        if (!_that.fileSuffixs.includes(suffix.toLocaleLowerCase())) {
                            mui.toast('请选择WORD文档', {
                                duration: 'long',
                                type: 'div'
                            })
                            return
                        }
                        if (checkFileNameForSensitiveWords(recordArr[0].name)) {
                            mui.toast('检测到敏感内容，请确认后再试。', {
                                duration: 'long',
                                type: 'div'
                            })
                            return false
                        }
                        _that.checkList(recordArr[0].path, recordArr[0].name, _that.channelId, recordArr[0].fileSize)
                    })
            }else {
                this.uploadFunc()
            }
        },
        uploadFunc(type) {
            // if(1 == type) {
            //     mui.toast("请选择修改内容", { duration: "long", type: "div" });
            //     return
            // }
            // this.fileType = type
            let _that = this
            wx.invoke("ext_FileBrowser_StartPreView", {}, function (res) {
                _that.channelId = "writing_upload_" + createNonceStr(8) + new Date().getTime() + "";

                if (_that.isflageIOX) {
                    const suffix = res.name.split('.').reverse()[0]
                    if(0 == Number(res.size)) {
                        mui.toast('文件不能为空', {
                          duration: 'long',
                          type: 'div'
                        })
                        return
                      }
                    if (!_that.fileSuffixs.includes(suffix.toLocaleLowerCase())) {
                        mui.toast('目前暂不支持该文件类型，请您核对后重新上传', {
                            duration: 'long',
                            type: 'div'
                        })
                        return
                    }
                    if (checkFileNameForSensitiveWords(res.name)) {
                        mui.toast('检测到敏感内容，请确认后再试。', {
                            duration: 'long',
                            type: 'div'
                        })
                        return false
                    }
                    _that.checkList(res.filePath, res.name, _that.channelId, res.size)
                } else {
                    let recordArr = JSON.parse(res.result)
                    const suffix = recordArr[0].name.split('.').reverse()[0]
                    if(0 == Number(recordArr[0].fileSize)) {
                        mui.toast('文件不能为空', {
                            duration: 'long',
                            type: 'div'
                        })
                        return
                    }
                    if (!_that.fileSuffixs.includes(suffix.toLocaleLowerCase())) {
                        mui.toast('请选择WORD文档', {
                            duration: 'long',
                            type: 'div'
                        })
                        return
                    }
                    if (checkFileNameForSensitiveWords(recordArr[0].name)) {
                        mui.toast('检测到敏感内容，请确认后再试。', {
                            duration: 'long',
                            type: 'div'
                        })
                        return false
                    }
                    _that.checkList(recordArr[0].path, recordArr[0].name, _that.channelId, recordArr[0].fileSize)
                }
            })
        },
        checkList(path, name, id, fileSize, hash, index) {
            $(".curtain").css("display", "block");
            let that = this
            that.disabledInp = true
            that.progressBar = true
            let iscp_port
            if (sessionStorage.getItem("iscp_port")) {
                iscp_port = sessionStorage.getItem("iscp_port");
            } else {
                iscp_port = ""
            }
            let Authentication = sessionStorage.getItem("Authentication");
            const timestamp = new Date().getTime() + ""
            let userId = sessionStorage.getItem("userId");
            let sign = sm3(timestamp + "&" + userId)
            that.fileName = name
            wx.invoke("ext_Net_FragmentUpload", {
                data: {
                    serverAddress: localUrlLink + iscp_port + `/tjAiAssistant/storage/splitUpload2?channelId=${id}`,
                    filePath: path,
                    fragmentSize: that.CHUNK_SIZE,
                    fileName: name,
                    fileHash: hash ? hash : '',
                    upLoadFragmentIndex: index ? index : '',
                    channelId: id,
                    headerData: {
                        sign: sign,
                        userId: userId,
                        type: '',
                        timestamp: timestamp,
                        Authentication: Authentication,
                    }
                },
            }, function (res) {
                if (res.err_msg.endsWith(":ok")) { //成功结果
                    //上传完成
                    // that.recording(id)
                    const suffix = name.split('.').reverse()[0]

                    addPendingData(104, id)

                    that.uploadComplete(id, name, fileSize)
                } else if (res.err_msg.endsWith(":cancel")) {
                    that.cleanData();
                    return
                } else {
                    //上传失败
                    if (that.myindex != Number(res.upLoadFragmentIndex)) {
                        that.myindex = Number(res.upLoadFragmentIndex);
                        that.retryNum = 0;
                    }
                    setTimeout(() => {
                        if (that.retryNum > 4) {
                            $(".curtain").css("display", "none");
                            // that.retryNum = 0
                            var btnArray = ["取消", "确定"];
                            var i = 0
                            mui.confirm(
                                "是否进行重试？",
                                "上传失败",
                                btnArray,
                                (e) => {
                                    if (i > 0) return
                                    i++
                                    if (e.index == 1) {
                                        that.checkList(path, name, id, fileSize, res.fileHash, res.upLoadFragmentIndex)
                                    } else {
                                        that.cleanData()
                                    }
                                }
                            );
                        } else {
                            that.retryNum++

                            that.checkList(path, name, id, fileSize, res.fileHash, res.upLoadFragmentIndex)
                        }

                    }, (that.retryNum + 1) * 1000)

                }
            })
        },
        calcFileSize(fileSize) {
            let kbf = (Math.floor((fileSize / 1024) * 100) / 100).toFixed(2);
            if (kbf > 1000) {
                //显示 MB
                return (Math.floor((fileSize / (1024 * 1024)) * 100) / 100).toFixed(2) + 'MB';
            }
            return kbf + 'KB';
        },
        cleanData() {
            this.disabledInp = false
            this.progressBar = false
        },
        uploadComplete(id, name, fileSize) {
            const userId = sessionStorage.getItem("userId");
            let param = {
                "userId": userId,
                "channelId": id,
                "type": this.writingType,
                "modelType": getLargeModelType(),
                "timestamp": new Date().getTime() + "",
            };
            let AuthenticationSession = sessionStorage.getItem("Authentication");
            data = JSON.stringify(param)
            let sign = sm3(data);
            $.ajax({
                url: localUrlLink + iscp_port + "/tjAiAssistant/writing/word2Md",
                type: "post",
                async: false, //是否同步，false表示同步请求
                dataType: "json",
                data: data,
                headers: {
                    "Content-Type": "application/json;charset=UTF-8",
                    Authentication: AuthenticationSession,
                    sign: sign
                },
                success: (res, txt, xhr) => {
                    $(".curtain").css("display", "none");
                    if (sm3(res.resultValueStr) == xhr.getResponseHeader("sign")) {
                        let Authentication = xhr.getResponseHeader("Authentication")
                        if (res.code == 200) {
                            if (Authentication) {
                                sessionStorage.setItem("Authentication", Authentication);
                            }
                            let attach = res.resultValue
                            if (0 == this.fileType) {
                                this.materialList.push({
                                    id: attach.channelId,
                                    fileName: name,
                                    type: 'word',
                                    size: fileSize,
                                    fileSize: calcFileSize(fileSize),
                                    viewId: id
                                })
                            } else if (1 == this.fileType) {
                                this.improveFile = {
                                    id: attach.channelId,
                                    fileName: name,
                                    type: 'word',
                                    size: fileSize,
                                    fileSize: calcFileSize(fileSize),
                                    viewId: id
                                }
                            }
                        } else {
                            let msg = res.resultValue
                            if('文件不能为空' != msg) {
                                msg = "请稍后再试"
                            }
                            mui.toast(msg, {
                                duration: 1000,
                                type: 'div'
                            })
                        }
                    }
                },
                error: (e) => {
                    $(".curtain").css("display", "none");
                    mui.toast('请稍后再试', {
                        duration: 1000,
                        type: 'div'
                    })
                },
            });
        },
        // 语音
        //开始录音
        startTalk(type, event) {
            this.timer = setTimeout(() => {
                if(this.timer) {
                    console.log("2222")
                    this.stopRecorder()
                    this.timer = null;
                    this.voiceType = type
                    this.voiceTxt = {
                        ind: '',
                        old: ''
                    }
                    this.voiceTxt.ind = this.voiceContent
                    this.getMeToken()
                }
              }, 100); // 触发长按事件

            // event.preventDefault();
            // if(0 != this.voiceType) {
            //     mui.toast('正在录音.', {
            //         duration: 'long',
            //         type: 'div'
            //     })
            // }else {
            //     this.voiceType = type
            //     this.voiceTxt = {
            //         ind: '',
            //         old: ''
            //     }
            //     this.voiceTxt.ind = this.voiceContent
            //     this.getMeToken()
            //     // startLuyin(this, 'voiceContent', 'voiceContent')
            // }
        },
        //停止录音
        stopTalk(type) {
            setTimeout(() => {
                console.log("qqqqq")
                this.voiceType = 0
                this.timer = clearTimeout(this.timer);
                this.timer = null;
                this.stopTalkCallBack()
                this.stopRecorder()
            }, 1000);
            // endLuyin(this, 'voiceContent', 'voiceContent', this, this.stopTalkCallBack())
        },
        stopTalkCallBack() {
            var voiceInput = document.getElementById('voiceContent')
            var _text = this.voiceContent

            if(voiceInput && _text) {
                voiceInput.setSelectionRange(_text.length, _text.length)
                // voiceInput.focus()
                voiceInput.scrollTop = voiceInput.scrollHeight
            }
            this.voiceType = 0
        },
        getMeToken() {
            if(this.voiceType == 0) {
                return
            }
            let _that = this
            var iscp_port = ''
            if (sessionStorage.getItem("iscp_port")) {
                iscp_port = sessionStorage.getItem("iscp_port");
            }
            userId = sessionStorage.getItem("userId");
            let AuthenticationSession = sessionStorage.getItem("Authentication");
            let timestamp = new Date().getTime() + ""
            let data = {
                "userId": userId,
                "timestamp": timestamp,
            }
            const datas = JSON.stringify(data)
            let sign = sm3(datas);
            $.ajax({
                url: localUrlLink + iscp_port + "/tjAiAssistant/soundRecording/thirdparty",
                type: "post",
                async: false, //是否同步，false表示同步请求
                dataType: "json",
                data: datas,
                headers: {
                    "Content-Type": "application/json;charset=UTF-8",
                    sign: sign,
                    Authentication: AuthenticationSession,
                },
                success: (res, txt, xhr) => {
                    if (sm3(res.resultValueStr) == xhr.getResponseHeader("sign")) {
                        let Authentication = xhr.getResponseHeader("Authentication")
                        if (res.code == 200) {
                            if (Authentication) {
                                sessionStorage.setItem("Authentication", Authentication);
                                _that.WS_URL =
                                    `ws://127.0.0.1:${iscp_port}/websocket/asr/i?token=${res.resultValue}&capacityCode=${_that.CAPACITY_CODE}&language=${_that.LANG}&code=${_that.MODEL_CODE}&sessionId=${_that.VoiceItemID}`
                                console.log("voiceType:", this.voiceType)
                                if(_that.voiceType == 0) {
                                    console.log("录音停止")
                                    return
                                }
                                if (!('WebSocket' in window)) {
                                    return
                                }
                                if (_that.count < 1) {
                                    wx.invoke("multiWindows_subscribe", { channelId: _that.VoiceItemID }, function (res) {
                                        console.log(res, "订阅返回结果")
                                        console.log(res.data.message, "信息")
                                        if (res.data.method == "onMessage String" && res.data.channelId == _that.VoiceItemID) {
                                            _that.onMessage(res)
                                        } else if (res.data.method == 'onReconnectFinishAndDisconn') {
                                            //重连失败处理
                                            _that.stopVB()
                                        }
                                    });
                                }
                                _that.count++
                                wx.invoke("ext_AudioRecorder_Start", {
                                    data: {
                                        channelId: _that.VoiceItemID,
                                        socketUrl: _that.WS_URL
                                    }
                                },
                                    function (res) {
                                        if (res.err_msg === 'ext_AudioRecorder_Start:ok') {
                                            //成功处理
                                            _that.checkClick = 1
                                            _that.checkSwitch = true
                                        }

                                        if (res.err_msg === 'ext_AudioRecorder_Start:fail') {
                                            //失败处理
                                        }
                                        if (res.err_msg === 'ext_AudioRecorder_Start:cancel') {
                                            //取消处理
                                        }
                                        if (res.err_msg === 'ext_AudioRecorder_Start:not_support ') {
                                        }
                                    })
                            }
                        } else {
                            mui.toast(res.resultValue, {
                                duration: 'long',
                                type: 'div'
                            })
                        }
                    }
                },
                error: (e) => {
                    mui.toast('请求异常,请稍后再试', {
                        duration: 1000,
                        type: 'div'
                    })
                },
            })
        },
        onOpen(evt, way, afterOpen) {
            let _that = this
            this.checkSwitch = true
            wx.startRecordVoiceBuffer({
                maxDuration: 100000000,
                sampleRate: 16000
            });
            wx.onRecordBufferReceived(function (res) {
                if (_that.isflageIOX) {
                    var a = ''
                    if (_that.bufferData.length == 26) {
                        _that.bufferData.forEach((item) => {
                            a += item
                            _that.bufferData = []
                        })
                        // _that.stopRecorder()
                        _that.doSend(a);
                    } else {
                        _that.bufferData.push(res.buffer)
                    }
                } else {

                    _that.doSend(res.buffer);
                }
            })
            if (!$(this).hasClass("stop")) {
                $(this).addClass("stop");
                let i = 0;
                $(this).data("interval", window.setInterval(function () {
                    $(".record-time").html((++i) + "s");
                }, 1000, i));
            }
        },
        doSend(message) {
            this.myWebsocket.readyState === 1 && this.myWebsocket.send(message);
        },
        onMessage(evt) {
            try {
                if(this.voiceType == 0) {
                    console.log("onMessage 停止")
                    this.stopVB()
                    return
                }
                // const data = JSON.parse(evt.data);
                const data = JSON.parse(evt.data.message);
                console.log(evt.data,"内容")
                if (data.code == 200) {
                    // 这一行是赋值的
                    data.word = data.word.replace(/[|]/g, '\n')
                    data.word = data.word.replace(/[\n]/g, '\n\n')
                    this.insertContent(data)
                } else if (data.code == 'E000004') {
                    mui.toast("当前已达到最大并发量限制,请稍后再试", {
                        duration: 'long',
                        type: 'div'
                    })
                    this.stopRecorder()
                } else {
                    mui.toast(data.code + "语音服务异常", {
                        duration: 'long',
                        type: 'div'
                    })
                    this.stopRecorder()
                }
            } catch (error) {
                throw new Error('解析错误!' + error);
            }
        },
        insertContent(data) {
            let txt = data.word
            let ctxt = ''
            if(data.completed) {
                //完成
                this.voiceTxt.old += txt
                ctxt = this.voiceTxt.old
            }else{
                //未完成
                ctxt = this.voiceTxt.old + txt
            }
            var voiceInput = document.getElementById('voiceContent')
            var _text = this.voiceTxt.ind + ctxt;

            this.voiceContent = this.voiceTxt.ind + ctxt

            if(voiceInput) {
                voiceInput.setSelectionRange(_text.length, _text.length)
                voiceInput.focus()
                voiceInput.scrollTop = voiceInput.scrollHeight
            }
        },
        stopRecorder(num) {
            console.log("停止录音")
            let _this = this
            wx.invoke("ext_AudioRecorder_Stop", {
                data: {}
            },
                function (res) {
                    if (res.err_msg === 'ext_AudioRecorder_Stop:ok') {
                        console.log("停止录音11")
                        _this.stopVB(num)
                    }
                    if (res.err_msg === 'ext_AudioRecorder_Stop:fail') {
                        //失败处理
                        console.log(res);
                    }
                    if (res.err_msg === 'ext_AudioRecorder_Stop:cancel') {
                        //取消处理
                        console.log(res);
                    }
                    if (res.err_msg === 'ext_AudioRecorder_Stop:not_support ') {
                        _this.stopVB(num)
                        console.log("停止录音22")
                        wx.stopRecordVoiceBuffer({});
                        // if (_this.myWebsocket) {
                        _this.myWebsocket.close();
                    }
                })
        },
        stopVB(num) {
            //成功处理
            console.log("停止录音33")
            this.time = clearInterval(this.time)
            // this.flag = true
            this.checkSwitch = false
            this.checkClick = 0
            $(this).removeClass("stop");
            window.clearInterval($(this).data("interval"));
            // $(".record-time").html("");
        },
        handleScrollBottom(refName) {
            // this.$nextTick(() => {
                let scrollElem = this.$refs[refName];
                if(scrollElem) {
                    $(scrollElem).stop(true, true)
                    $(scrollElem).animate({ scrollTop: $(scrollElem).prop('scrollHeight')},20)
                }
            // })
        },
        preview(item) {
            myPreviewFile(item)
        },
        //分享
        shareIgw(item) {
            if(!item.id) {
                return
            }
            shareIgw({
                sceneNo: '104',
                shareType: 1,
                attchId: item.id
            })
         },
         noticeShare() {
            shareIgw({
                sceneNo: '104',
                shareType: 0,
                content: html2Md(this.noticeHtmlContent),
            })
         },
        //内容发送邮件
        noticeSendMail() {
            mySendMail('会议通知', this.noticeMdContent, 10, 4)
        },
        //文件发送邮箱
        sendMyEmail(result) { 
            if(!result.id) {
                return
            }
            mySendMail('会议通知', "answerAttach="+result.id, 10, 4)
        },
        //同步到内网统一入口
        syncToInner(result) {
            if(!result.id) {
                return
            }
            mySyncToInner('会议通知', "answerAttach="+result.id, 10, 4)
        },
        getTemplateList() {
            const userId = sessionStorage.getItem("userId");
            let param = {
                "userId": userId,
                "type": this.writingType,
                "timestamp": new Date().getTime() + "",
            };
            let AuthenticationSession = sessionStorage.getItem("Authentication");
            data = JSON.stringify(param)
            let sign = sm3(data);
            $.ajax({
                url: localUrlLink + iscp_port + "/tjAiAssistant/template/getTemplateList",
                type: "post",
                async: true, //是否同步，false表示同步请求
                dataType: "json",
                data: data,
                headers: {
                    "Content-Type": "application/json;charset=UTF-8",
                    Authentication: AuthenticationSession,
                    sign: sign
                },
                success: (res, txt, xhr) => {
                    if (sm3(res.resultValueStr) == xhr.getResponseHeader("sign")) {
                        let Authentication = xhr.getResponseHeader("Authentication")
                        if (res.code == 200) {
                            if (Authentication) {
                                sessionStorage.setItem("Authentication", Authentication);
                            }
                            this.modelImages = []
                            this.modelList = res.resultValue
                            if(this.modelList && 0 < this.modelList.length) {
                                this.curModelId = this.modelList[0].id
                                this.modelList.forEach(item => {
                                    this.modelImages.push(item.img)
                                })
                            }
                        } else {
                            mui.toast('请稍后再试', {
                                duration: 1000,
                                type: 'div'
                            })
                        }
                    }
                },
                error: (e) => {
                    $(".curtain").css("display", "none");
                    mui.toast('请稍后再试', {
                        duration: 1000,
                        type: 'div'
                    })
                },
            });
        },
        //复制按钮
        copy() {
            let text1 = this.clipboard.content;
            var clipboard = new Clipboard(".tag-read", {
                // 通过target指定要复印的节点
                text: function () {
                    return text1;
                },
            });
            clipboard.on("success", (e) => {
                addOperator(2, 11, "复制文本", 1, 1, "复制成功");
                mui.toast("复制成功", {
                    duration: "long",
                    type: "div"
                });
            });
            clipboard.on("error", (e) => {
                addOperator(2, 11, "复制文本", 1, 0, "复制失败");
            });
        },
        parseChineseDateTime(dateStr) {
            const pattern = /^(\d{4})年(\d{2})月(\d{2})日 (\d{2}):(\d{2})$/;
            const match = dateStr.match(pattern);
            
            if (!match) {
                throw new Error('无效的日期时间格式，请使用"YYYY年MM月DD日 HH:mm"格式');
            }
            
            const [, year, month, day, hour, minute] = match.map(Number);
            
            // 验证日期有效性
            const date = new Date(year, month - 1, day, hour, minute);
            if (
                date.getFullYear() !== year ||
                date.getMonth() + 1 !== month ||
                date.getDate() !== day ||
                date.getHours() !== hour ||
                date.getMinutes() !== minute
            ) {
                throw new Error('无效的日期时间值');
            }
            
            return date;
            },
        // 判断安卓还是ios
        compatibleInput() {
            //获取浏览器的userAgent,并转化为小写
            var ua = navigator.userAgent.toLowerCase();
            //判断是否是苹果手机，是则是true
            var isIos = ua.indexOf("iphone") != -1 || ua.indexOf("ipad") != -1;
            if (isIos) {
                this.isflageIOX = true;
            } else {
                this.isflageIOX = false;
            }
        },
        home() {
            $(location).attr("href", "index.html");
        },
        createSgin(data) {
            let hashData = sm3(data);
            let hashData_last = sm3(hashData);
            hashData_last = hashData_last.substr(0, 5);
            hashData += hashData_last;
            let sign = hashData;
            return sign;
        },
        sendEmail() {
            console.log('发送邮箱')
        },
    }
})